크게 두 영역으로 분리됩니다

00009 사용여부, 00017 사용자상태TB_SMP01 | 샘플01 | ||||||||||||||
USER_CD | 사용자코드 | Y | Y | VARCHAR2 | 10 | ||||||||||
USER_ID | 사용자ID | N | N | VARCHAR2 | 18 | ||||||||||
USER_NM | 사용자명 | N | N | VARCHAR2 | 30 | ||||||||||
USER_ENG_NM | 사용자영문명 | N | N | VARCHAR2 | 50 | ||||||||||
USER_PW | 비밀번호 | N | N | VARCHAR2 | 18 | ||||||||||
USER_IMG | 사용자이미지 | N | N | VARCHAR2 | 10 | ||||||||||
USER_BIRTHDAY | 사용자생년월일 | N | N | VARCHAR2 | 8 | ||||||||||
LUNAR_CD | 양력음력구분 | N | N | VARCHAR2 | 5 | ||||||||||
USER_EMAIL | 사용자이메일 | N | N | VARCHAR2 | 100 | ||||||||||
USER_MOBILE | 사용자휴대폰번호 | N | N | VARCHAR2 | 30 | ||||||||||
USER_TEL | 사용자전화번호 | N | N | VARCHAR2 | 30 | ||||||||||
USER_FAX | 사용자FAX | N | N | VARCHAR2 | 30 | ||||||||||
POST_CD | 우편번호 | N | N | VARCHAR2 | 10 | ||||||||||
USER_ADDR1 | 사용자 주소1 | N | N | VARCHAR2 | 150 | ||||||||||
USER_ADDR2 | 사용자 주소2 | N | N | VARCHAR2 | 50 | ||||||||||
DEPT_CD | 부서코드 | N | N | VARCHAR2 | 10 | ||||||||||
USER_POSITION | 사용자직위 | N | N | VARCHAR2 | 5 | ||||||||||
USER_GRADE | 사용자등급 | N | N | VARCHAR2 | 5 | ||||||||||
USER_STATUS | 사용자상태 | N | N | VARCHAR2 | 5 | ||||||||||
DESC_TXT | 상세설명 | N | N | VARCHAR2 | 2000 | ||||||||||
USE_YN | 사용여부 | N | N | VARCHAR2 | 1 | ||||||||||
AGREE_YN | 동의여부 | N | N | VARCHAR2 | 1 | ||||||||||
AGREE_DT | 동의일시 | N | N | DATE | - | ||||||||||
LOGIN_FAIL_CNT | 로그인실패횟수 | N | N | VARCHAR2 | 2 | ||||||||||
LAST_LOGIN_DT | 최종로그인일시 | N | N | DATE | - | ||||||||||
PW_CHANGE_DT | 비밀번호변경일시 | N | N | DATE | - | ||||||||||
INIT_YN | 초기화여부 | N | N | VARCHAR2 | 1 | ||||||||||
LOGIN_DEVICE | 접속기기 | N | N | VARCHAR2 | 50 | ||||||||||
LOGIN_BROWSER | 접속환경 | N | N | VARCHAR2 | 50 | ||||||||||
LOGIN_IP | 접속IP | N | N | VARCHAR2 | 25 | ||||||||||
JOIN_DATE | 입사일 | N | N | VARCHAR2 | 8 | ||||||||||
MAIN_PROJECT | 메인프로젝트 | N | N | VARCHAR2 | 10 | ||||||||||
VALID_YN | 유효여부 | N | N | VARCHAR2 | 1 | ||||||||||
VALID_START_DATE | 유효시작일자 | N | N | VARCHAR2 | 8 | ||||||||||
VALID_END_DATE | 유효종료일자 | N | N | VARCHAR2 | 8 | ||||||||||
REG_DT | 등록일시 | Y | N | DATE | - | ||||||||||
REG_CD | 등록자코드 | N | N | VARCHAR2 | 10 | ||||||||||
MOD_DT | 수정일시 | Y | N | DATE | - | ||||||||||
MOD_CD | 수정자코드 | N | N | VARCHAR2 | 10 | ||||||||||
TB_SMP02 | 샘플02 | ||||||||||||||
DEPT_CD | 부서코드 | Y | Y | VARCHAR2 | 5 | ||||||||||
DEPT_NM | 부서명 | N | N | VARCHAR2 | 50 | ||||||||||
DEPT_ENG_NM | 부서영문명 | N | N | VARCHAR2 | 50 | ||||||||||
ML_CD | 다국어코드 | N | N | VARCHAR2 | 10 | ||||||||||
PARENT_DEPT | 상위부서 | N | N | VARCHAR2 | 5 | ||||||||||
DEPT_LEVEL | 부서LEVEL | N | N | VARCHAR2 | 2 | ||||||||||
DEPT_ORDER | 부서정렬순서 | N | N | VARCHAR2 | 50 | ||||||||||
DESC_TXT | 상세설명 | N | N | VARCHAR2 | 500 | ||||||||||
USE_YN | 사용여부 | N | N | VARCHAR2 | 1 | ||||||||||
REG_DT | 등록일시 | Y | N | DATE | - | ||||||||||
REG_CD | 등록자코드 | N | N | VARCHAR2 | 10 | ||||||||||
MOD_DT | 수정일시 | Y | N | DATE | - | ||||||||||
MOD_CD | 수정자코드 | N | N | VARCHAR2 | 10 | ||||||||||

form

smpForm01
1659 px832 px
Code Snippet 기능을 활용해 기초 코드를 빠르게 완성할 수 있습니다.

영역별로 구분된 기초 코드가 완성되었습니다.

Form_onload함수를 onload Event에 할당합니다.

공통코드(00009)를 위한 dsCboUseYn을 추가합니다.

코드ID코드명기타1기타2기타3
fnInit 함수를 호출합니다.
/*********************************************************
* 1.2 FORM EVENT 영역(onload등)
********************************************************/
/**
* Form_onload 최초 로드시 발생되는 이벤트 (필수)
*/
this.Form_onload = function(obj:Form, e:nexacro.LoadEventInfo)
{
if (take.formOnLoad(this))
{
//초기화
this.fnInit();
}
};
fnInit 함수는 form이 onload되거나 MDI탭에 의해 활성화 될 경우 실행됩니다.
/*********************************************************
* 4 사용자 FUNCTION 영역
********************************************************/
/**
* fnInit : 초기화 함수 검색조건 초기화
* @return {N/A} N/A
* @example this.fnInit();
*/
this.fnInit = function()
{
// 공통코드
this.fnCommonCode();
};
take.tranCode 함수를 사용하여 공통코드 조회기능을 구현합니다.
/*********************************************************
* 4 사용자 FUNCTION 영역
********************************************************/
/**
* fnCommonCode : 코드호출 함수
* @param {String} N/A
* @example this.fnCommonCode();
*/
this.fnCommonCode = function ()
{
take.tranCode(
this, // 현재 Form 객체
["00009"], // 코드그룹ID : 시스템 - 코드관리
["dsCboUseYn"], // InDataset (코드그룹ID 개수와 동일해야함)
["SEL"], // 콤보헤더용 (ALL:전체, SEL:선택, "":사용안함)
// (코드그룹ID 개수와 동일해야함)
// Callback 함수 (함수명도 사용 가능 ex:"fnCallback")
function(sId, nErrCd, sErrMsg)
{
// sId : Transaction Id
// nErrCd : Return Code (음수:오류)
// sErrMsg : Return Message
},
true // true:비동기, false:동기 (기본값은 비동기)
);
};
Eclipse의 Tomcat을 구동시키고 Nexacro Studio의 QuickView를 실행합니다.

브라우저 빈공간에 ctrl + q를 입력하면 디버깅 화면이 팝업됩니다.Dataset - this.dsCboUseYn - View 로 이동하여 Dataset을 확인할 수 있습니다.

공통코드(00017)을 위한 dsCboStatus를 추가합니다.

코드ID코드명기타1기타2기타3
코드그룹ID, InDataset을 추가합니다.
/*********************************************************
* 4 사용자 FUNCTION 영역
********************************************************/
/**
* fnCommonCode : 코드호출 함수
* @param {String} N/A
* @example this.fnCommonCode();
*/
this.fnCommonCode = function ()
{
take.tranCode(
this, // 현재 Form 객체
["00009", "00017"], // 코드그룹ID : 시스템 - 코드관리
["dsCboUseYn", "dsCboStatus"], // InDataset (코드그룹ID 개수와 동일해야함)
["SEL", ""], // 콤보헤더용 (ALL:전체, SEL:선택, "":사용안함)
// (코드그룹ID 개수와 동일해야함)
// Callback 함수 (함수명도 사용 가능 ex:"fnCallback")
function(sId, nErrCd, sErrMsg)
{
// sId : Transaction Id
// nErrCd : Return Code (음수:오류)
// sErrMsg : Return Message
},
true // true:비동기, false:동기 (기본값은 비동기)
);
};
Eclipse의 Tomcat을 구동시키고 Nexacro Studio의 QuickView를 실행합니다.

브라우저 빈공간에 ctrl + q를 입력하면 디버깅 화면이 팝업됩니다.Dataset - this.dsCboStatus - View 로 이동하여 Dataset을 확인할 수 있습니다.

이전 단계처럼 Dataset을 추가합니다.

공통코드 조회 Callback 에서 take.tranSelect를 사용한 부서 데이터 조회를 구현합니다.
/*********************************************************
* 4 사용자 FUNCTION 영역
********************************************************/
/**
* fnCommonCode : 코드호출 함수
* @param {String} N/A
* @example this.fnCommonCode();
*/
this.fnCommonCode = function ()
{
// 변수 선언
var objDsCboDept;
objDsCboDept = this.dsCboDept;
// 부서 Dataset 데이터 비우기
objDsCboDept.clearData();
take.tranCode(
... 중략 ....
// Callback 함수 (함수명도 사용 가능 ex:"fnCallback")
function(sId, nErrCd, sErrMsg)
{
// 부서 데이터 조회
take.tranSelect
(
this, // 현재 Form 객체
"deptList", // Transaction Id
"Sample01.smpFormDeptSelect", // sqlMapperId
"", // Indataset(서버로 보낼 Dataset)
"dsCboDept", // Outdataset(서버에서 받을 Dataset)
"", // Parameter
"fnCallback" // Callback 함수명 (함수를 바로 사용 가능)
);
},
true // true:비동기, false:동기 (기본값은 비동기)
);
};
모든 Transaction에 대한 Callback 작업을 fnCallback에 정의하는것이 기본입니다.take.tranSelect에서 지정한 Transaction Id로 구분할 수 있으며 조회 이후 동작을 구현할 수 있습니다.
/*********************************************************
* 5 TRANSACTION OR CALLBACK 콜백 처리부분
********************************************************/
/**
* fnCallback : transaction callback
* @param : sId - 서비스 아이디 (공통 콜백에서 넘어옴)
* @param : nErrCd - 에러코드 (공통 콜백에서 넘어옴)
* @param : sErrMsg - 에러메세지 (공통 콜백에서 넘어옴)
* @return : N/A
* @example :
*/
this.fnCallback = function(sId, nErrCd, sErrMsg)
{
//Transaction 에러는 공통에서 처리
switch(sId)
{
// 부서 검색조건 조회 콜백
case "deptList" :
break;
default :
break;
}
};
TB_SMP01을 조회 시 사용할 검색조건입니다. Desc | TB_SMP01 | Component Id | Dataset Column | Inner Dataset |
| DEPT_CD | cboDeptCd | deptCd | dsCboDept |
| USER_ID | edtUserId | userId | - |
| USE_YN | cboUseYn | useYn | dsCboUseYn |

div_WF_search_d1divSearch id를 임의로 변경 하지 말 것004201300
divSearch 내부에 Static을 추가합니다.
staDeptT id를 임의로 변경 하지 말 것사용자 부서2087024
divSearch 내부에 Combo를 추가합니다.
cboDept id를 임의로 변경 하지 말 것90 staDeptT와의 공백 : 0px818024
dsCboDeptcodename
기본값 지정을 위해 fnCallback을 수정합니다.dsCboDept의 데이터가 존재할 경우 cboDept의 index를 0으로 지정합니다.
/*********************************************************
* 5 TRANSACTION OR CALLBACK 콜백 처리부분
********************************************************/
/**
* fnCallback : transaction callback
* @param : sId - 서비스 아이디 (공통 콜백에서 넘어옴)
* @param : nErrCd - 에러코드 (공통 콜백에서 넘어옴)
* @param : sErrMsg - 에러메세지 (공통 콜백에서 넘어옴)
* @return : N/A
* @example :
*/
this.fnCallback = function(sId, nErrCd, sErrMsg)
{
//Transaction 에러는 공통에서 처리
switch(sId)
{
// 부서 검색조건 조회 콜백
case "deptList" :
// 변수 선언
var objDs, objCboDept;
// 부서 검색조건 Dataset
objDs = this.dsCboDept;
objCboDept = this.divSearch.form.cboDept;
// 부서 검색조건 데이터가 있으면
if (objDs.rowcount > 0)
{
// 부서콤보 첫번째 데이터 세팅
objDs.insertRow(0);
objDs.setColumn(0, "code", "");
objDs.setColumn(0, "name", "전체");
objCboDept.set_index(0);
}
break;
default :
break;
}
};
divSearch 내부에 Static을 추가합니다.
staUserIdT id를 임의로 변경 하지 말 것ID31087024
divSearch 내부에 Edit를 추가합니다.
edtUserId id를 임의로 변경 하지 말 것380 staUserIdT와의 공백 : 0px814024
divSearch 내부에 Static을 추가합니다.
staUseYnT id를 임의로 변경 하지 말 것사용여부56087024
divSearch 내부에 Combo를 추가합니다.
cboUseYn id를 임의로 변경 하지 말 것630 staUseYnT와의 공백 : 0px814024
dsCboUseYncodename
기본값 지정을 위해 fnCommonCode를 수정합니다.dsCboUseYn의 데이터가 존재할 경우 cboUseYn의 index를 0으로 지정합니다.
/*********************************************************
* 4 사용자 FUNCTION 영역
********************************************************/
/**
* fnCommonCode : 코드호출 함수
* @param {String} N/A
* @example this.fnCommonCode();
*/
this.fnCommonCode = function ()
{
// 변수 선언
var objDsCboDept, objCboUseYn, objDsCboUseYn;
objDsCboDept = this.dsCboDept;
objCboUseYn = this.divSearch.form.cboUseYn;
objDsCboUseYn = this.dsCboUseYn;
... 중략 ....
take.tranCode(
... 중략 ....
// Callback 함수 (함수명도 사용 가능 ex:"fnCallback")
function(sId, nErrCd, sErrMsg)
{
// 사용여부 공통코드 데이터가 있는지 여부
if (objDsCboUseYn.rowcount > 0)
{
// 사용여부 검색조건 콤보에 첫번째 값 세팅
objCboUseYn.set_index(0);
}
},
true // true:비동기, false:동기 (기본값은 비동기)
);
};
dsSearch를 만들고 아래 컬럼들과 1행을 추가해 줍니다.

부서코드 cboDeptCd의 value를 Binding 합니다.
dsSearchdeptCd
사용자ID edtUserId의 value를 Binding 합니다.
dsSearchuserId
사용여부 cboUseYn의 value를 Binding 합니다.
dsSearchuseYn
부서코드 Combo를 변경할 때 fnSearch 함수를 호출 합니다.
/*********************************************************
* 3 각 COMPONENT 별 EVENT 영역
********************************************************/
this.divSearch_cboDept_onitemchanged = function(obj:nexacro.Combo,e:nexacro.ItemChangeEventInfo)
{
//사용자 목록 조회
this.fnSearch("userList");
};
사용여부 Combo를 변경할 때 fnSearch 함수를 호출 합니다.
/*********************************************************
* 3 각 COMPONENT 별 EVENT 영역
********************************************************/
this.divSearch_cboUseYn_onitemchanged = function(obj:nexacro.Combo,e:nexacro.ItemChangeEventInfo)
{
//사용자 목록 조회
this.fnSearch("userList");
};
사용자ID Edit에서 Enter키 입력될 때 fnSearch 함수를 호출합니다.
/*********************************************************
* 3 각 COMPONENT 별 EVENT 영역
********************************************************/
this.divSearch_edtUserId_onkeydown = function(obj:nexacro.Edit,e:nexacro.KeyEventInfo)
{
//엔터키 다운
if (e.keycode == nexacro.Event.KEY_ENTER)
{
//사용자 목록 조회
this.fnSearch("userList");
}
};
Eclipse에서 src/main/resources/mappers/sample/Sample01Mapper.xml 를 생성합니다.
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="Sample01">
<!-- 쿼리 영역 -->
</mapper>
smpFormDeptSelect 를 쿼리 영역에 작성합니다.
<select id="smpFormDeptSelect" parameterType="map" timeout="0" resultType="takeResultMap" useCache="false">
<![CDATA[
/*
* Sample01.smpFormDeptSelect
* 부서 목록 조회
* @author takeit
* @since 2023.04.24
*/
]]>
SELECT DEPT_CD AS CODE
, DEPT_NM AS NAME
FROM TB_SMP02
WHERE PARENT_DEPT = '0'
ORDER BY DEPT_CD, DEPT_NM
</select>
smpFormSelect 를 쿼리 선언부에 작성합니다.
<select id="smpFormSelect" parameterType="map" timeout="0" resultType="takeResultMap" useCache="false">
<![CDATA[
/*
* Sample01.smpFormSelect
* 샘플 목록 조회
* @author takeit
* @since 2023.04.24
*/
]]>
SELECT USER_CD
, USER_ID
, USER_NM
, USER_BIRTHDAY
, USER_EMAIL
, USER_MOBILE
, USER_TEL
, USER_FAX
, DEPT_CD
, USER_STATUS
, USE_YN
, AGREE_YN
, JOIN_DATE
FROM TB_SMP01
WHERE (CASE WHEN USE_YN IS NULL THEN 'N' ELSE USE_YN END) = #{useYn}
<if test="@kr.co.takeit.util.MybatisUtil@notEmpty( deptCd ) ">
AND DEPT_CD = #{deptCd}
</if>
<if test="@kr.co.takeit.util.MybatisUtil@notEmpty( userId ) ">
AND USER_ID LIKE <include refid="UxbInc.like"><property name="arg1" value="#{userId}"/></include>
</if>
ORDER BY USER_CD
</select>
Eclipse의 Tomcat을 재시작 합니다.
take.tranSelect를 사용한 TB_SMP01 데이터 조회를 구현합니다.
/*********************************************************
* 2 필수 FUNCTION 영역
********************************************************/
/**
* fnSearch : 조회 transaction (필수) --> 공통 조회에서 호출할 디폴트값 세팅 필요
* @param {String} sTranId 트랜젝션 아이디
* @return {N/A} N/A
* @example this.fnSearch("ID");
*/
this.fnSearch = function(sTranId)
{
//공통 조회에서 호출할 디폴트값 세팅 필요
if (take.isEmpty(sTranId)) sTranId = "userList";
switch(sTranId) {
case "userList" :
// 변수 선언
var objDivSearch, objDsList;
var sParam;
objDivSearch = this.divSearch.form;
objDsList = this.dsList;
sParam = "";
// Dataset 비우기
objDsList.clearData();
// 조회
take.tranSelect(
this, // 현재 Form 객체
sTranId, // Transaction Id
"Sample01.smpFormSelect", // SQL Mapper Id
"dsSearch", // InDataset(서버로 보낼 Dataset)
"dsList", // OutDataset(서버에서 받을 Dataset)
"", // Parameter
"fnCallback"); // Callback 함수명(함수를 바로 사용 가능)
break;
default:
break;
}
};
switch ~ case구문에 Transaction Id가 userList인 경우를 추가해줍니다.
/*********************************************************
* 5 TRANSACTION OR CALLBACK 콜백 처리부분
********************************************************/
/**
* fnCallback : transaction callback
* @param : sId - 서비스 아이디 (공통 콜백에서 넘어옴)
* @param : nErrCd - 에러코드 (공통 콜백에서 넘어옴)
* @param : sErrMsg - 에러메세지 (공통 콜백에서 넘어옴)
* @return : N/A
* @example :
*/
this.fnCallback = function(sId, nErrCd, sErrMsg)
{
//Transaction 에러는 공통에서 처리
switch(sId)
{
// 부서 검색조건 조회 콜백
case "deptList" :
...중략...
break;
// 조회 콜백
case "userList" :
break;
default :
break;
}
};
TB_SMP01 데이터를 위한 dsList를 추가합니다.


사용여부를 사용으로 선택합니다.
ctrl + q를 입력하여 디버깅 화면을 조회합니다.Dataset - this.dsList - view 로 이동하여 Dataset을 확인할 수 있습니다.
XML(all)로 이동하여 Dataset의 ColumnInfo를 복사합니다.
Nexacro Studio로 돌아와 dsList의 source로 이동합니다.
ColumnInfo를 붙여넣어 Dataset 컬럼 정보를 간편하게 등록할 수 있습니다.
사용여부 Static과 Combo에 필수입력임을 알려주는 CSS를 적용합니다.
sta_color_orangecmb_WF_essentialtakeval.add 함수를 사용하여 사용여부를 밸리데이션 검증 대상으로 추가합니다.
/*********************************************************
* 4 사용자 FUNCTION 영역
********************************************************/
/**
* fnInit : 초기화 함수 검색조건 초기화
* @return {N/A} N/A
* @example this.fnInit();
*/
this.fnInit = function()
{
// 공통코드
this.fnCommonCode();
// 변수 선언
var objDivForm;
objDivForm = this.divSearch.form;
// 밸리데이션 추가
takeval.add(
this,
"Search", // 밸리데이션 그룹 ID(밸리데이션 대상을 그룹으로 관리)
objDivForm.cboUseYn, // 밸리데이션 대상
objDivForm.staUseYnT.text, // 밸리데이션 명칭
"value", // 밸리데이션 대상 속성(Component:Property, Grid:Cell, Dataset:Column)
true, // Null Check 여부
"string", // Data Type(string, number, date)
"", // Data Length(string:length, number/date:[form,to])
""); // Byte Check 여부(생략가능)
};
takeval.check 함수를 호출하여 밸리데이션을 검증합니다.
/*********************************************************
* 2 필수 FUNCTION 영역
********************************************************/
/**
* fnSearch : 조회 transaction (필수) --> 공통 조회에서 호출할 디폴트값 세팅 필요
* @param {String} sTranId 트랜젝션 아이디
* @return {N/A} N/A
* @example this.fnSearch("ID");
*/
this.fnSearch = function(sTranId)
{
//공통 조회에서 호출할 디폴트값 세팅 필요
if (take.isEmpty(sTranId)) sTranId = "userList";
switch(sTranId) {
case "userList" :
// 밸리데이션 검증
if(!takeval.check(this, "Search")) return;
// 변수 선언
var objDivSearch, objDsList;
var sParam;
...중략...
}
};
사용여부를 선택하지 않았을 때 밸리데이션 검증을 실패합니다.
그리고 사용자에게 안내 메시지가 출력되며 실패한 Component로 Focus가 이동합니다.


divDetail id를 임의로 변경 하지 말 것073001300
divDetail 내부에 Static을 추가합니다.
sta_WF_title02staDetailTitle id를 임의로 변경 하지 말 것사용자 목록true00210
divDetail 내부에 Grid를 추가합니다.

grdDetail id를 임의로 변경 하지 말 것col06 ~ staDetailTitle00
binddataset속성을 dsList로 지정합니다.

binddataset속성을 지정하게 되면 아래와 같이 Dataset의 컬럼들이 Grid에 추가됩니다.

dsList의 데이터가 Grid에 출력되는 것을 확인할 수 있습니다.
아직 Grid 헤더와 너비, 높이, 정렬을 수정해야합니다.
또한 코드로 표현되고있는 셀Text를 명칭으로 변환해야합니다.

Head Row의 size를 32로 변경합니다.

Body Row의 size를 30으로 변경합니다.

userCd 컬럼을 삭제합니다.text와 size를 지정합니다. Col | text | Size |
userId | ID | 80 |
userNm | 성명 | 110 |
userBirthday | 생년월일 | 120 |
userEmail | 이메일 | 160 |
userMobile | 모바일 | 110 |
userTel | 유선전화 | 110 |
userFax | 팩스 | 110 |
deptCd | 부서명 | 100 |
userStatus | 상태 | 100 |
useYn | 사용여부 | 100 |
agreeYn | 동의여부 | 80 |
joinDate | 가입일자 | 120 |
combotextdsCboDeptcodename
combotextdsCboStatuscodename
combotextdsCboUseYncodename
datecenteryyyy-MM-dd
코드로 표현되고있던 셀Text가 명칭으로 변환되었습니다.
더불어 가입일자도 날짜 형태로 변환되었습니다.
Dateset을 그대로 유지한채 Grid의 셀 출력형태만 변경된 것 입니다.

Grid userproperty 를 추가합니다.
takegridselect
타이틀 우측으로 전체건수가 표현됩니다.
Grid에 순번 컬럼이 추가됩니다.
나머지 기능은 Grid를 우클릭하여 사용할 수 있습니다.

form 영역에 버튼을 추가합니다.

btn_WF_searchFoldbtnShowHide id를 임의로 변경 하지 말 것공백48.76%-1 ~ divSearch4016
divDetail Properties 수정-1 ~ btnShowHide
